home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / kcl / kcl.lha / uts / hasegawa / unixsave.c < prev    next >
C/C++ Source or Header  |  1987-05-08  |  7KB  |  355 lines

  1. /*
  2. (C) Copyright Taiichi Yuasa and Masami Hagiya, 1984.  All rights reserved.
  3. */
  4.  
  5. /*
  6.     unixsave.c
  7. */
  8.  
  9. #include "include.h"
  10.  
  11. /* When MACHINE is S3000, use fcntl.h */
  12. #ifdef S3000
  13. #include <fcntl.h>
  14. #else
  15. #include <sys/file.h>
  16. #endif
  17.  
  18. #ifdef BSD
  19. #include <a.out.h>
  20. #endif
  21.  
  22. #ifdef VAX
  23. #define    PAGSIZ        1024
  24. #define    SEGSIZ        1024
  25. #define    TXTRELOC    0
  26. #endif
  27.  
  28. #ifdef ISI
  29.  
  30.  
  31.  
  32. #endif
  33.  
  34. #ifdef SEQ
  35.  
  36.  
  37. #endif
  38.  
  39. #ifdef NEWS
  40. #define    TXTRELOC    0
  41. #endif
  42.  
  43. #ifdef IBMRT
  44.  
  45.  
  46.  
  47. #endif
  48.  
  49. #ifdef ATT
  50. #include <filehdr.h>
  51. #include <aouthdr.h>
  52. #include <scnhdr.h>
  53. #define exec        aouthdr
  54. #define a_text        tsize
  55. #define a_data        dsize
  56. #define a_bss        bsize
  57. #endif
  58.  
  59. #ifdef E15
  60. #include <a.out.h>
  61. extern    etext;
  62. #define exec        bhdr
  63. #define a_text        tsize
  64. #define a_data        dsize
  65. #define a_bss        bsize
  66. #define a_syms        ssize
  67. #define a_trsize    rtsize
  68. #define a_drsize    rdsize
  69. #define    SEGSIZ        (128*1024)
  70. #define    TXTRELOC    (1024*1024)
  71. #endif
  72.  
  73.  
  74. filecpy(to, from, n)
  75. FILE *to, *from;
  76. register int n;
  77. {
  78.     char buffer[BUFSIZ];
  79.  
  80.     for (;;)
  81.         if (n > BUFSIZ) {
  82.             fread(buffer, BUFSIZ, 1, from);
  83.             fwrite(buffer, BUFSIZ, 1, to);
  84.             n -= BUFSIZ;
  85.         } else if (n > 0) {
  86.             fread(buffer, 1, n, from);
  87.             fwrite(buffer, 1, n, to);
  88.             break;
  89.         } else
  90.             break;
  91. }
  92.  
  93.  
  94. memory_save(original_file, save_file)
  95. char *original_file, *save_file;
  96. {
  97.  
  98. #ifdef BSD
  99.     struct exec header;
  100.     int stsize;
  101. #endif
  102. #ifdef ATT
  103.     struct filehdr fileheader;
  104.     struct exec header;
  105.     struct scnhdr sectionheader;
  106.     int diff;
  107. #endif
  108. #ifdef E15
  109.     struct exec header;
  110. #endif
  111.  
  112.     char *data_begin, *data_end;
  113.     int original_data;
  114.     FILE *original, *save;
  115.     register int n;
  116.     register char *p;
  117.     extern char *sbrk();
  118.     extern char stdin_buf[BUFSIZ], stdout_buf[BUFSIZ];
  119.  
  120.     fclose(stdin);
  121.     original = fopen(original_file, "r");
  122.     if (stdin != original || original->_file != 0) {
  123.         fprintf(stderr, "Can't open the original file.\n");
  124.         exit(1);
  125.     }
  126.     setbuf(original, stdin_buf);
  127.     fclose(stdout);
  128.     unlink(save_file);
  129.     n = open(save_file, O_CREAT|O_WRONLY, 0777);
  130.     if (n != 1 || (save = fdopen(n, "w")) != stdout) {
  131.         fprintf(stderr, "Can't open the save file.\n");
  132.         exit(1);
  133.     }
  134.     setbuf(save, stdout_buf);
  135.  
  136. #ifdef BSD
  137.     fread(&header, sizeof(header), 1, original);
  138.  
  139. #ifdef VAX
  140.     data_begin
  141.     = (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
  142. #endif
  143. #ifdef SUN
  144.     data_begin
  145.     = (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
  146. #endif
  147. #ifdef SUN2R3
  148.     data_begin = (char *)N_DATADDR(header);
  149. #endif
  150. #ifdef SUN3
  151.     data_begin = (char *)N_DATADDR(header);
  152. #endif
  153. #ifdef NEWS
  154.     data_begin
  155.     = (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
  156. #endif
  157. #ifdef ISI
  158.  
  159.  
  160. #endif
  161. #ifdef SEQ
  162.  
  163.  
  164. #endif
  165. #ifdef IBMRT
  166.  
  167.  
  168. #endif
  169.  
  170.     data_end = core_end;
  171.     original_data = header.a_data;
  172.     header.a_data = data_end - data_begin;
  173.     header.a_bss = 0;
  174.     fwrite(&header, sizeof(header), 1, save);
  175.  
  176. #ifdef VAX
  177.     if (header.a_magic == ZMAGIC)
  178.         filecpy(save, original, PAGSIZ - sizeof(header));
  179.     filecpy(save, original, header.a_text);
  180. #endif
  181. #ifdef SUN
  182.     if (header.a_magic == ZMAGIC)
  183.         filecpy(save, original, PAGSIZ - sizeof(header));
  184.     filecpy(save, original, header.a_text);
  185. #endif
  186. #ifdef SUN2R3
  187.     filecpy(save, original, header.a_text - sizeof(header));
  188. #endif
  189. #ifdef SUN3
  190.     filecpy(save, original, header.a_text - sizeof(header));
  191. #endif
  192. #ifdef NEWS
  193.     if (header.a_magic == ZMAGIC)
  194.         filecpy(save, original, PAGSIZ - sizeof(header));
  195.     filecpy(save, original, header.a_text);
  196. #endif
  197. #ifdef ISI
  198.  
  199.  
  200.  
  201.  
  202. #endif
  203. #ifdef SEQ
  204.  
  205.  
  206. #endif
  207. #ifdef IBMRT
  208.  
  209.  
  210.  
  211. #endif
  212. #endif
  213.  
  214. #ifdef ATT
  215.     fread(&fileheader, sizeof(fileheader), 1, original);
  216.     fread(&header, sizeof(header), 1, original);
  217.     data_begin = (char *)header.data_start;
  218.     data_end = core_end;
  219.     original_data = header.a_data;
  220.     header.a_data = data_end - data_begin;
  221.     diff = header.a_data - original_data;
  222.     header.a_bss = sbrk(0) - core_end;
  223.     fileheader.f_symptr += diff;
  224.     fwrite(&fileheader, sizeof(fileheader), 1, save);
  225.     fwrite(&header, sizeof(header), 1, save);
  226.     fread(§ionheader, sizeof(sectionheader), 1, original);
  227.     if (sectionheader.s_lnnoptr)
  228.         sectionheader.s_lnnoptr += diff;
  229.     fwrite(§ionheader, sizeof(sectionheader), 1, save);
  230.     fread(§ionheader, sizeof(sectionheader), 1, original);
  231.     sectionheader.s_size += diff;
  232.     if (sectionheader.s_lnnoptr)
  233.         sectionheader.s_lnnoptr += diff;
  234.     fwrite(§ionheader, sizeof(sectionheader), 1, save);
  235.     fread(§ionheader, sizeof(sectionheader), 1, original);
  236.     sectionheader.s_paddr += diff;
  237.     sectionheader.s_vaddr += diff;
  238.     sectionheader.s_size = header.a_bss;
  239. #ifdef S3000
  240.         if (sectionheader.s_scnptr)
  241.                 sectionheader.s_scnptr += diff;
  242. #endif
  243.     if (sectionheader.s_lnnoptr)
  244.         sectionheader.s_lnnoptr += diff;
  245.     fwrite(§ionheader, sizeof(sectionheader), 1, save);
  246.     for (n = 4;  n <= fileheader.f_nscns;  n++) {
  247.         fread(§ionheader, sizeof(sectionheader), 1, original);
  248.         if (sectionheader.s_scnptr)
  249.             sectionheader.s_scnptr += diff;
  250.         if (sectionheader.s_lnnoptr)
  251.             sectionheader.s_lnnoptr += diff;
  252.         fwrite(§ionheader, sizeof(sectionheader), 1, save);
  253.     }
  254.     filecpy(save, original, header.a_text);
  255. #endif
  256.  
  257. #ifdef E15
  258.     fread(&header, sizeof(header), 1, original);
  259.     if (header.fmagic != NMAGIC)
  260.         data_begin
  261.         = (char *)(TXTRELOC+header.a_text);
  262.     else
  263.         data_begin
  264.         = (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
  265.     data_end = core_end;
  266.     original_data = header.a_data;
  267.     header.a_data = data_end - data_begin;
  268.     header.a_bss = sbrk(0) - core_end;
  269.     fwrite(&header, sizeof(header), 1, save);
  270.     filecpy(save, original, header.a_text);
  271. #endif
  272.  
  273.     for (n = header.a_data, p = data_begin;  ;  n -= BUFSIZ, p += BUFSIZ)
  274.         if (n > BUFSIZ)
  275.             fwrite(p, BUFSIZ, 1, save);
  276.         else if (n > 0) {
  277.             fwrite(p, 1, n, save);
  278.             break;
  279.         } else
  280.             break;
  281.  
  282.     fseek(original, original_data, 1);
  283.  
  284. #ifdef BSD
  285.     filecpy(save, original, header.a_syms+header.a_trsize+header.a_drsize);
  286.     fread(&stsize, sizeof(stsize), 1, original);
  287.     fwrite(&stsize, sizeof(stsize), 1, save);
  288.     filecpy(save, original, stsize - sizeof(stsize));
  289. #endif
  290.  
  291. #ifdef ATT
  292.     for (;;) {
  293.         n = getc(original);
  294.         if (feof(original))
  295.             break;
  296.         putc(n, save);
  297.     }
  298. #endif
  299.  
  300. #ifdef E15
  301.     filecpy(save, original, header.a_syms+header.a_trsize+header.a_drsize);
  302. #endif
  303.  
  304.     fclose(original);
  305.     fclose(save);
  306. }
  307.  
  308. Lsave()
  309. {
  310.     char filename[256];
  311.  
  312.     check_arg(1);
  313.     check_type_or_pathname_string_symbol_stream(&vs_base[0]);
  314.     coerce_to_filename(vs_base[0], filename);
  315. /*
  316.     _cleanup();
  317. */
  318.     {
  319.         FILE *p;
  320.         int nfile;
  321.  
  322. #ifdef BSD
  323.         nfile = getdtablesize();
  324. #else
  325.         nfile = _NFILE;
  326. #endif
  327.         for (p = &_iob[3];  p < &_iob[nfile];  p++)
  328.             fclose(p);
  329.     }
  330.     memory_save(kcl_self, filename);
  331. /*
  332.     _exit(0);
  333. */
  334.     exit(0);
  335.     /*  no return  */
  336. }
  337.  
  338. init_unixsave()
  339. {
  340.     make_function("SAVE", Lsave);
  341. }
  342.  
  343. #ifdef ISI
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354. #endif
  355.